/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package InstanciaJogo.FasesJogo;

import ClassesListas.Imagens;
import InstanciaJogo.InstanciaJogoSwing;
import java.awt.Image;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;

/**
 * Estatica
 *
 * Versao 1.0
 *
 * Data Criação 07/08/2013
 *
 * @author Igor
 */
public class Estatica extends InstanciaSubFasePattern{
    //Construtor
    public Estatica(long subFase) {
        super(subFase);
        setIdFase(1);
    }

    //Outros metodos
    @Override
    public void apresentarImagem(InstanciaJogoSwing instanciaJogo, boolean jogoPausado) throws Exception {
        Imagens imagemApresentada;
        int largura = instanciaJogo.getLabelImagem().getWidth();
        int altura = instanciaJogo.getLabelImagem().getHeight();
        int imagensApresentadas = 0;
        this.tempoParaAvaliar = System.currentTimeMillis(); 

        //So apresenta a imagem se nao estiver apresentando imagens atualmente
        if (!instanciaJogo.getLabelImagem().equals("imagemRosto")) {
            //Crio o timer antes de apresentar, caso o usuario avalie muito rapidamente
            setTimerApresentarImagem(new Timer());
            if(jogoPausado){
                imagemApresentada = imagemApresentadaAtual();
            }else{
                imagemApresentada = retornaProximaImagemApresentada();
                setQuantidadeImagensParaAvaliar(getQuantidadeImagensParaAvaliar() - 1);
            }

            imagensApresentadas = (getImagensDinamicas().getImagensApresentadasSubFase().size() - this.getQuantidadeImagensParaAvaliar());

            ImageIcon ig = new ImageIcon(imagemApresentada.getImagens().get(0).getDiretorio().toString());
            //Amplia a imagem fazendo-a ocupar todo o JLabel
            instanciaJogo.getLabelImagem().setIcon(new ImageIcon(ig.getImage().getScaledInstance(largura, altura, Image.SCALE_DEFAULT)));
            instanciaJogo.atualizarLabel(instanciaJogo.getLabelImagem());
            
            instanciaJogo.getLabelStatus().setText("Fase: " + instanciaJogo.getFase() + "." + getSubFase()
                    + "     Imagem Apresentada: " + imagensApresentadas + "/" + getImagensDinamicas().getImagensApresentadasSubFase().size());
            instanciaJogo.atualizarLabel(instanciaJogo.getLabelStatus());
            
            /*if(instanciaJogo.getModoJogo() != 1){
                imagemApresentada.getImagens().get(0).gravaImagemApresentadaSubFase(this.idInstanciaSubFase, 0);
            }*/
            
            if(getTimerApresentarImagem() != null){
                getTimerApresentarImagem().schedule(new RemindTaskEstatica(instanciaJogo, getTimerApresentarImagem(), instanciaJogo.getTempoApresentacaoImagens(), imagemApresentada), 0, 1 * 1000);
            }
        }
    }

    @Override
    public boolean avaliarExpressaoImagem(int idExpressao, long idModoJogo) throws Exception {
        boolean flag = false;
        this.tempoParaAvaliar = System.currentTimeMillis() - this.tempoParaAvaliar;
        
        //Cancelo o timer pois ja avaliei, entao a troca de imagem nao sera por tempoParaAvaliar e sim realizada neste metodo
        if (getTimerApresentarImagem() != null) {
            stopTimer();
        }

        if (this.imagemApresentadaAtual().getImagens().get(0).getIdExpressaoResposta() == null) {
            long idExpressao1 = imagemApresentadaAtual().getImagens().get(0).getIdExpressao();
            this.imagemApresentadaAtual().getImagens().get(0).setIdExpressaoResposta(idExpressao);
            
            //Preenche tds imagens com uma expressao de resposta
            for (int i = 0; i < this.imagemApresentadaAtual().getImagens().size(); i++) {
                this.imagemApresentadaAtual().getImagens().get(i).setIdExpressaoResposta(idExpressao);
            }
            
            if (idExpressao1 == idExpressao) {
                flag = true;
                setQuantidadeImagensAvaliadasCorretamente(getQuantidadeImagensAvaliadasCorretamente() + 1);
            }
            //So grava a avaliacao se nao estiver no Treinamento
            if (idModoJogo != 1) {
                imagemApresentadaAtual().getImagens().get(0).gravaImagemApresentadaSubFase(this.idInstanciaSubFase, this.tempoParaAvaliar);
            }
        }

        return flag;
    }

    class RemindTaskEstatica extends TimerTask {

        private int segundos;
        private InstanciaJogoSwing instanciaJogo = null;
        private Timer timer = null;
        private Imagens imagemApresentada;

        public RemindTaskEstatica(InstanciaJogoSwing jogo, Timer timer, int tempoEspera, Imagens imagemApresentada) {
            this.segundos = tempoEspera;
            this.instanciaJogo = jogo;
            this.timer = timer;
            this.imagemApresentada = imagemApresentada;
        }

        @Override
        public void run() {
            if (this.segundos == 0) {
                this.timer.cancel();
                stopTimer();
                this.instanciaJogo.getLabelImagem().setIcon(null);
                this.instanciaJogo.atualizarLabel(this.instanciaJogo.getLabelImagem());
                if(instanciaJogo.getModoJogo() != 1){
                    try {
                        imagemApresentada.getImagens().get(0).gravaImagemApresentadaSubFase(idInstanciaSubFase, 0);
                    } catch (Exception ex) {
                        Logger.getLogger(Estatica.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                this.instanciaJogo.apresentaTransicaoImagens();
            }
            segundos--;
        }
    }
}
